package ar.com.uade.administradorsiembra.controladores;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

import ar.com.uade.administradorsiembra.modelo.Lote;
import ar.com.uade.administradorsiembra.modelo.LoteSimple;
import ar.com.uade.administradorsiembra.modelo.Mineral;
import ar.com.uade.administradorsiembra.modelo.MineralPorcentaje;
import ar.com.uade.administradorsiembra.modelo.Propietario;
import ar.com.uade.administradorsiembra.modelo.exceptions.LoteInexistenteException;
import ar.com.uade.administradorsiembra.modelo.exceptions.PropietarioInexcstenteException;
import ar.com.uade.administradorsiembra.persistencia.LoteMapper;
import ar.com.uade.administradorsiembra.persistencia.MineralMapper;
import ar.com.uade.administradorsiembra.persistencia.MineralPorcentajeMapper;
import ar.com.uade.administradorsiembra.persistencia.PropietarioMapper;
import ar.com.uade.administradorsiembra.views.LoteView;
import ar.com.uade.administradorsiembra.views.MineralPorcentajeView;
import ar.com.uade.administradorsiembra.views.MineralView;
import ar.com.uade.administradorsiembra.views.PropietarioView;

public class ABMLoteSimpleController {
	private static ABMLoteSimpleController controller;
	private PropietarioMapper propietarioMapper;
	private LoteMapper loteMapper;
	private MineralMapper mineralMapper;
	private MineralPorcentajeMapper mineralPorcentajeMapper;
	
	private MineralPorcentajeMapper getMineralPorcentajeMapper(){
		if(this.mineralPorcentajeMapper == null) {
			this.mineralPorcentajeMapper = new MineralPorcentajeMapper();
		}
		return this.mineralPorcentajeMapper;
	}
	
	private ABMLoteSimpleController(){	
	}
	
	private PropietarioMapper getPropietarioMapper(){
		if(propietarioMapper == null){
			propietarioMapper = new PropietarioMapper();
		}
		
		return propietarioMapper;
	}
	
	private MineralMapper getMineralMapper(){
		if(mineralMapper == null){
			mineralMapper = new MineralMapper();
		}
		
		return mineralMapper;
	}
	
	private LoteMapper getLoteMapper(){
		if(loteMapper == null){
			loteMapper = new LoteMapper();
		}
		
		return loteMapper;
	}
	
	public static ABMLoteSimpleController getInstancia(){
		if(controller == null) {
			controller = new ABMLoteSimpleController();
		}
		
		return controller;
	}
	public List<PropietarioView> getPropietarios(){
		List<PropietarioView> propViews = new LinkedList<PropietarioView>();
		List<Propietario> propietarios = this.getPropietarioMapper().buscarTodos();
		for (Propietario prop : propietarios) {
			propViews.add(prop.getView());
		}
		return propViews;
	}
	public List<MineralView> getMinerales(){
		List<MineralView> mineralViews = new LinkedList<MineralView>();
		List<Mineral> minerales = this.getMineralMapper().buscarTodos();
		for (Mineral mineral : minerales) {
			mineralViews.add(mineral.getView());
		}
		return mineralViews;
	}
	
	public void crearLoteSimple(Integer numeroLote, Float areaSiembra,
			Integer dniPropietario, List<MineralPorcentajeView> list)
			throws PropietarioInexcstenteException {

		Propietario propietario = getPropietarioMapper()
				.buscarPorDni(dniPropietario);
		if (propietario != null) {
			Lote lote = new LoteSimple(numeroLote, propietario, areaSiembra);
			getLoteMapper().guardar(lote);
			lote = getLoteMapper().buscarPorId(lote.getNumeroLote());
			List<MineralPorcentaje> mineralesPorcentaje = new LinkedList<MineralPorcentaje>();
			for (MineralPorcentajeView mineralPorcentajeView : list) {
				mineralesPorcentaje.add(new MineralPorcentaje( lote.getId(),
						new Mineral(mineralPorcentajeView.getMineral().getId(),
									mineralPorcentajeView.getMineral().getCodigo(),
									mineralPorcentajeView.getMineral().getNombre()
									), mineralPorcentajeView.getPorcentaje())
				);
			}
			lote.setMinerales(mineralesPorcentaje);
			getLoteMapper().guardar(lote);

		} else {
			throw new PropietarioInexcstenteException();
		}
	}

	public void modificarLoteSimple(Integer numeroLote, Float areaSiembra,
			Integer dniPropietario, List<MineralPorcentajeView> porcentajes)
			throws PropietarioInexcstenteException, LoteInexistenteException {

		Propietario propietario = getPropietarioMapper()
				.buscarPorDni(dniPropietario);

		if (propietario != null) {
			Lote lote = getLoteMapper().buscarPorId(numeroLote);
			
			if (lote != null) {
				lote.setMinerales(this.getMineralPorcentajeMapper().buscarPorLote(lote.getId()));
				lote.modificar(areaSiembra, propietario);
				MineralPorcentaje mineralPorcentaje = null;
				int index = 0;
				for (MineralPorcentajeView mineralPorcentajeView : porcentajes) {
					if(lote.getView().getMinerales().contains(mineralPorcentajeView)){
						index = lote.getView().getMinerales().indexOf(mineralPorcentajeView);
						mineralPorcentaje = lote.getMinerales().get(index);
						mineralPorcentaje.setPorcentaje(mineralPorcentajeView.getPorcentaje());
					}else{
					
							
					
					lote.getMinerales().add(new MineralPorcentaje( lote.getId(),
												new Mineral(mineralPorcentajeView.getMineral().getId(),
															mineralPorcentajeView.getMineral().getCodigo(),
															mineralPorcentajeView.getMineral().getNombre()
															),
												mineralPorcentajeView.getPorcentaje()));
					}
					
				
				}
				
				
				getLoteMapper().modificar(lote);
			} else {
				throw new LoteInexistenteException();
			}
		} else {
			throw new PropietarioInexcstenteException();
		}
	}
	
	public void borrarLoteSimple(Integer numeroLote) throws LoteInexistenteException{
		if(getLoteMapper().borrar(getLoteMapper().buscarPorId(numeroLote)) == false){
			throw new LoteInexistenteException();
			
		}
	}

	public List<LoteView> getLotes() {
		List<LoteView> lotes = new LinkedList<LoteView>();
		
		for (Lote lote : this.getLoteMapper().buscarTodos()) {
			
			lotes.add(lote.getView());
			
		}
		return lotes;
	}

	public void completarMinerales(LoteView lote) {
		// TODO Auto-generated method stub
		List<MineralPorcentaje> minerales = this.getMineralPorcentajeMapper().buscarPorLote(lote.getId());
		List<MineralPorcentajeView> mineralesView = new ArrayList<MineralPorcentajeView>();
		for (MineralPorcentaje mineralPorcentaje : minerales) {
			mineralesView.add(mineralPorcentaje.getView());
		}
		lote.setMinerales(mineralesView);
	}
}
